static void ptc_ga_remote_func (void *varg)
{
- u64 oldrid, moldrid;
+ u64 oldrid, moldrid, mpta;
struct ptc_ga_args *args = (struct ptc_ga_args *)varg;
VCPU *v = args->vcpu;
VMX(v, vrr[0]) = args->rid;
moldrid = ia64_get_rr(0x0);
ia64_set_rr(0x0,vrrtomrr(v,args->rid));
+ mpta = ia64_get_pta();
+ ia64_set_pta(v->arch.arch_vmx.mpta);
ia64_srlz_d();
vmx_vcpu_ptc_l(v, args->vadr, args->ps);
VMX(v, vrr[0]) = oldrid;
ia64_set_rr(0x0,moldrid);
+ ia64_set_pta(mpta);
ia64_dv_serialize_data();
}
// machine_tlb_purge(va, ps);
}
-static void
-switch_rr7_and_pta(VCPU* v)
-{
- if (VMX_DOMAIN(v))
- vmx_load_rr7_and_pta(v);
- else
- load_region_reg7_and_pta(v);
-}
/*
* purge VHPT and machine TLB
size = PSIZE(ps);
start = va & (-size);
end = start + size;
- if (current != v)
- switch_rr7_and_pta(v);
while(start < end){
hash_table = (thash_data_t *)ia64_thash(start);
tag = ia64_ttag(start);
start += PAGE_SIZE;
}
machine_tlb_purge(va, ps);
- if (current != v)
- switch_rr7_and_pta(current);
}
/*